package org.chartsy.lucasseries; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.Line2D; import java.util.Calendar; import java.util.LinkedHashMap; import org.chartsy.main.ChartFrame; import org.chartsy.main.chart.Overlay; import org.chartsy.main.data.DataItem; import org.chartsy.main.data.Dataset; import org.chartsy.main.utils.Range; import org.chartsy.main.utils.SerialVersion; import org.openide.nodes.AbstractNode; /** * * @author Viorel */ public class LucasSeries extends Overlay { private static final long serialVersionUID = SerialVersion.APPVERSION; public static final String LS = "ls"; private OverlayProperties properties; public LucasSeries() { super(); properties = new OverlayProperties(); } public String getName() { return "Lucas Series"; } public String getLabel() { return properties.getLabel(); } public Overlay newInstance() { return new LucasSeries(); } public LinkedHashMap getHTML(ChartFrame cf, int i) { return new LinkedHashMap(); } public void paint(Graphics2D g, ChartFrame cf, Rectangle bounds) { Dataset ls = visibleDataset(cf, LS); if ( ls != null ) { Range range = cf.getSplitPanel().getChartPanel().getRange(); g.setColor(properties.getColor()); g.setStroke(properties.getStroke()); double y = cf.getChartData().getY(range.getLowerBound(), bounds, range, false); g.draw(new Line2D.Double(bounds.getMinX(), y, bounds.getMaxX(), y)); for (int i = 0; i < ls.getItemsCount(); i++) { if ( ls.getDataItem(i) != null ) { double x = cf.getChartData().getX(i, bounds); double y1 = cf.getChartData().getY(range.getLowerBound(), bounds, range, false); double y2 = cf.getChartData().getY(range.getUpperBound(), bounds, range, false); double w = cf.getChartProperties().getBarWidth(); g.draw(new Line2D.Double(x - w/2, y1, x, y2)); g.draw(new Line2D.Double(x + w/2, y1, x, y2)); } } } } public void calculate() { Dataset initial = getDataset(); Calendar c2 = Calendar.getInstance(); int start = -1; for (int i = 0; i < initial.getItemsCount(); i++) { long time = initial.getTimeAt(i); c2.setTimeInMillis(time); if ( c2.get(Calendar.DAY_OF_MONTH) == properties.getStartingDay() && (c2.get(Calendar.MONTH) + 1) == properties.getStartingMonth() && c2.get(Calendar.YEAR) == properties.getStartingYear() && c2.get(Calendar.HOUR_OF_DAY) == properties.getStartingHour() && c2.get(Calendar.MINUTE) == properties.getStartingMinute() ) { start = i; break; } } if ( start != -1 ) { // calculation here Dataset ls = Dataset.EMPTY(initial.getItemsCount()); for (int i = start; i < initial.getItemsCount(); i++) { int diff = i - start; if ( diff == 3 || diff == 4 || diff == 7 || diff == 11 || diff == 18 || diff == 29 || diff == 47 || diff == 76 || diff == 123 || diff == 199 || diff == 322 || diff == 521 || diff == 843 || diff == 1364 || diff == 2207 || diff == 3571 ) { ls.setDataItem(i, new DataItem(initial.getTimeAt(i), 1)); } } addDataset(LS, ls); } } public Color[] getColors() { return new Color[] {}; } public double[] getValues(ChartFrame cf) { return new double[] {}; } public double[] getValues(ChartFrame cf, int i) { return new double[] {}; } public boolean getMarkerVisibility() { return false; } public AbstractNode getNode() { return new OverlayNode(properties); } public String getPrice() { return Dataset.CLOSE; } public boolean isIncludedInRange() { return false; } }